/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufc.quixada.adrs.comandos.admin;

import br.ufc.quixada.adrs.interfaces.Comando;
import br.ufc.quixada.adrs.model.Contato;
import br.ufc.quixada.adrs.model.Endereco;
import br.ufc.quixada.adrs.model.Produtor;
import br.ufc.quixada.adrs.model.Usuario;
import br.ufc.quixada.adrs.service.MunicipioService;
import br.ufc.quixada.adrs.service.ProdutorService;
import br.ufc.quixada.adrs.util.Msg;
import br.ufc.quixada.adrs.util.UtilAdrs;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author Franklin
 */
public class CmdAdminAddProdutor implements Comando {

    public String executa(HttpServletRequest request, HttpServletResponse response) {

        HttpSession session = request.getSession(true);

        //dados usuario
        String usuario_nome = (String) request.getParameter("nome_produtor");
        session.setAttribute("usuario_nome", usuario_nome);
        String apelido = (String) request.getParameter("apelido");
        session.setAttribute("apelido", apelido);
        String rg = (String) request.getParameter("rg");
        session.setAttribute("rg", rg);
        String cpf = (String) request.getParameter("cpf");
        session.setAttribute("cpf", cpf);
        String contato1 = (String) request.getParameter("contato1");
        session.setAttribute("contato1", contato1);
        String contato2 = (String) request.getParameter("contato2");
        session.setAttribute("contato2", contato2);
        String email = (String) request.getParameter("email");
        session.setAttribute("email", email);
        String localidade = (String) request.getParameter("localidade");
        session.setAttribute("localidade", localidade);
        String distanciaSede = (String) request.getParameter("distancia_sede");
        session.setAttribute("distanciaSede", distanciaSede);
        String municipio_nome = (String) request.getParameter("municipio");
        String estado_nome = (String) request.getParameter("estado");

        //dados produtor
        String estadoCivil = request.getParameter("estadoCivil");
        session.setAttribute("estadoCivil", estadoCivil);
        String conjuge = request.getParameter("conjuge");
        session.setAttribute("conjuge", conjuge);
        String conjugeCpf = request.getParameter("conjuge_cpf");
        session.setAttribute("conjugeCpf", conjugeCpf);
        String pai = request.getParameter("pai");
        session.setAttribute("pai", pai);
        String mae = request.getParameter("mae");
        session.setAttribute("mae", mae);
        String dap = request.getParameter("dap");
        session.setAttribute("dap", dap);
        String latitude = request.getParameter("latitude");
        session.setAttribute("latitude", latitude);
        String longitude = request.getParameter("longitude");
        session.setAttribute("longitude", longitude);

        Produtor produtorAlterar = null;
        if (!request.getParameter("operacao_produtor").equalsIgnoreCase("0")) {
            produtorAlterar = new ProdutorService().getProdutorById(Long.parseLong(request.getParameter("operacao_produtor")));
        }
        if (cpf.length() != 14) {
            session.setAttribute("erro", Msg.INPUT_ERROR_INVALID_PRODUTOR_CPF);
            session.setAttribute("atualizar_produtor", produtorAlterar);
            return "/admin/admin_add_produtor.jsp";
        }

        if (conjugeCpf != null && conjugeCpf.length() != 14 && !conjugeCpf.trim().isEmpty()) {
            session.setAttribute("erro", Msg.INPUT_ERROR_INVALID_CONJUGE_CPF);
            session.setAttribute("atualizar_produtor", produtorAlterar);
            return "/admin/admin_add_produtor.jsp";
        }

        //validando campos numericos
        if (!UtilAdrs.verificaNumeroInteiro(distanciaSede)) {
            session.setAttribute("erro", Msg.NOT_NUMERIC_DISTANCIA);
            session.setAttribute("atualizar_produtor", produtorAlterar);
            return "/admin/admin_add_produtor.jsp";
        }

        if (!latitude.matches(Msg.COORDENADAS_REGEX) || !longitude.matches(Msg.COORDENADAS_REGEX)
                || !UtilAdrs.verificaNumeroReal(latitude) || !UtilAdrs.verificaNumeroReal(longitude)) {
            session.setAttribute("erro", Msg.NOT_COORDINATES);
            session.setAttribute("atualizar_produtor", produtorAlterar);
            return "/admin/admin_add_produtor.jsp";
        }

        if (usuario_nome == null || apelido == null || cpf == null || contato1 == null
                || localidade == null || distanciaSede == null || municipio_nome.equalsIgnoreCase("-1") || estado_nome.equalsIgnoreCase("-1")
                || usuario_nome.trim().isEmpty() || apelido.trim().isEmpty()
                || cpf.trim().isEmpty() || contato1.trim().isEmpty() || localidade.trim().isEmpty()
                || distanciaSede.trim().isEmpty()) {
            session.setAttribute("erro", Msg.REQUIRED_FIELDS);
            session.setAttribute("atualizar_produtor", produtorAlterar);
            return "/admin/admin_add_produtor.jsp";
        }

        ProdutorService produtorService = new ProdutorService();
        MunicipioService municipioService = new MunicipioService();

        if (request.getParameter("operacao_produtor").equalsIgnoreCase("0")) {
            //admin nao adicionando produtor.
        } else {
            Produtor alterar_produtor = produtorService.getProdutorById(Long.parseLong(request.getParameter("operacao_produtor")));

            //Alterar Endereco
            Endereco alterar_endereco = alterar_produtor.getUsuario().getEndereco();
            alterar_endereco.setDistanciaSede(Integer.parseInt(distanciaSede));
            alterar_endereco.setLocalidade(localidade);
            alterar_endereco.setMunicipio(municipioService.getMunicipioById(Long.parseLong(municipio_nome)));

            //Alterar Usuario
            Usuario alterar_usuario = alterar_produtor.getUsuario();
            alterar_usuario.setNome(usuario_nome);
            alterar_usuario.setApelido(apelido);
            alterar_usuario.setCpf(cpf);
            alterar_usuario.setRg(rg);
            alterar_usuario.setEmail(email);

            //Alterar Contato
            Contato alterar_c1 = alterar_produtor.getUsuario().getContatos().get(0);
            alterar_c1.setNumero(contato1);

            if (alterar_produtor.getUsuario().getContatos().size() > 1) {
                Contato alterar_c2 = alterar_produtor.getUsuario().getContatos().get(1);
                if (contato2.trim().isEmpty() != true) {
                    alterar_c2.setNumero(contato2);
                }
            } else {
                if (contato2.trim().isEmpty() != true) {//para casos com um telefone
                    Contato contatoAdd = new Contato();
                    contatoAdd.setUsuario(alterar_produtor.getUsuario());
                    contatoAdd.setNumero(contato2);
                    alterar_produtor.getUsuario().getContatos().add(contatoAdd);
                }
            }

            //Alterar Produtor
            if (estadoCivil.equalsIgnoreCase("casado")) {
                alterar_produtor.setEstadoCivil(Produtor.ESTADO_CIVIL_CASADO);
                alterar_produtor.setConjuge(conjuge);
                alterar_produtor.setConjugeCpf(conjugeCpf);
            } else {
                alterar_produtor.setEstadoCivil(Produtor.ESTADO_CIVIL_SOLTEIRO);
                alterar_produtor.setConjuge(null);
                alterar_produtor.setConjugeCpf(null);
            }
            alterar_produtor.setDAP(dap.trim().isEmpty() ? null : dap);
            alterar_produtor.setMae(mae);
            alterar_produtor.setPai(pai);
            alterar_produtor.setLatitude(latitude.trim().isEmpty() || latitude.trim().isEmpty() ? null : Double.parseDouble(latitude));
            alterar_produtor.setLongitude(latitude.trim().isEmpty() || latitude.trim().isEmpty() ? null : Double.parseDouble(longitude));

            String mensagemDeValidacao = produtorService.validaParaEdicao(alterar_produtor);
            if (!mensagemDeValidacao.equals(Msg.OK)) {
                session.setAttribute("erro", mensagemDeValidacao);
                session.setAttribute("atualizar_produtor", produtorAlterar);
                return "/admin/admin_add_produtor.jsp";
            }
            
            if (produtorService.updateProdutor(alterar_produtor)) {
                session.setAttribute("sucesso", Msg.SUCCESSFULLY_EDITED);
            } else {
                session.setAttribute("erro", Msg.OPERATIONAL_ERROR_EDITING);
            }
        }
        return "/ServletCentral?comando=CmdAdminVisualizarProdutor&id_produtor=" + produtorAlterar.getId();
    }
}
